perm filename FILER[NS,SYS] blob
sn#118925 filedate 1974-09-10 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00012 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 Definitions. The file DEFS must be assembled with this file.
C00004 00003 Storage allocations.
C00009 00004 MAIN NEWFIL GETTTY
C00016 00005 END1
C00019 00006 GETCH PUTCH PUTSTR
C00022 00007 UUCODE NXTDG CHGWIR
C00024 00008 CHGNAM INTRPT
C00026 00009 APCODE NYCODE
C00032 00010 SETSHF CLRSHF SPE1-7 CKPARA SPE0
C00034 00011 FILER
C00036 00012 CHKTEM
C00039 ENDMK
C⊗;
;Definitions. The file DEFS must be assembled with this file.
TITLE FILER of wire news services' news
;BUFCNT←←1 ;TYPE OUT NUMBER OF CHARS IN EACH BUFFER FROM TTY12
IFNDEF DEBUG <DEBUG←←0>
IFNDEF BUFCNT <BUFCNT←←0>
; ACCUMULATOR ASSIGNMENTS
F←0 ;unused
A←1 ;TEMPORARY AC
B←2 ;TEMPORARY AC
C←3 ;CURRENT CHAR
D←4 ;unused
E←5 ;LF COUNTER--USED TO DETECT END OF STORY
L←6 ;LAST CHAR SEEN
M←7 ;NUMBER OF COLS OUTPUT SO FAR ON CURRENT LINE
N←10 ;NUMBER OF FREE BYTES LEFT IN OUTPUT BUFFER
Q←11 ;unused
R←12 ;CODE OF CURRENT WIRE BEING SERVICED
W←13 ;W,X,Y,Z ARE USED AS LOOKUP/ENTER BLOCK
X←14
Y←15
Z←16
P←17 ;pdl pointer
I←←0 ;CHANNEL FOR TTY12 INPUT
T←←10 ;CHANNEL FOR OUTPUT TEXT FILE
T1←←17 ;CHANNEL FOR LOOKING UP OLD OUTPUT FILE TO SEE IF IT IS GONE
;Storage allocations.
DEFINE EACH {FOR @! N ε {01}} ;LIST OF WIRE NUMBERS
'HOT' ;CODE WORD FOR HOT TO LOCATE HOTLINE BUFFERS
SBUF: EACH {
SBUF!N: BLOCK LSPCL}
SPOINT: EACH {
SPTR!N: POINT 7,SBUF!N}
SCOUNT: EACH {
(LSPCL-2)*5}
SFRONT: EACH {
POINT 7,SBUF!N}
;XWIRES IS DEFINED IN DEFS AND SETS UP WIRES AND NWIRES
XWIRES
CODE: C,,NYCODE
C,,APCODE
MASK: 140 ;BITS THAT SHOULDN'T BE ON IN NYT CHAR
100 ; " " " " " " AP "
;HERE ARE THE OUTPUT BUFFER HEADERS AND OUTPUT BUFFERS FOR EACH WIRE
EACH
{OBUF!N: BLOCK 3
BUF!N: BLOCK 3+200+1
}
BUFMAX←←=95 ;MAXIMUM NUMBER OF CHARS THE SYSTEM TTY INPUT BUFFERS WILL HOLD
NIBUFS←←1 ;NUMBER OF USER INPUT BUFFERS PER INPUT WIRE
BUFLN←←30 ;DEFAULT USER TTY BUFFER SIZE
EACH
{IBUF!N: BLOCK 3
}
TTYBUF:: ;HERE ARE THE INPUT BUFFERS FOR THE INPUT WIRES
EACH
{TTBF!N: BLOCK NIBUFS*(BUFLN+3)
}
;INDIRECT POINTERS TO INPUT BYTE COUNTS
ICOUNT: EACH
{IBUF!N + 2
}
;INDIRECT POINTERS TO INPUT BYTE POINTERS
IPOINT: EACH
{IBUF!N + 1
}
;INDIRECT POINTERS TO OUTPUT BYTE COUNT
OCOUNT: EACH
{OBUF!N + 2
}
;INDIRECT POINTERS TO OUTPUT BYTE POINTERS
OPOINT: EACH
{OBUF!N + 1
}
;flag indicating upper or lower shift characters
SHIFT: EACH
{SHIFT!N:: 0
}
;NAMES OF PREVIOUS TFL FILE FOR EACH WIRE
OLDNAM: EACH
{OLDNM!N:: 0
}
;PLACE TO SAVE PC FOR EACH WIRE'S CO-ROUTINE
PC: EACH
{NEWFIL
}
TTSKIP: EACH
{TTYSKP N,
}
;PLACE TO SAVE ONE AC FOR EACH WIRE'S CO-ROUTINE
ESAVE: EACH
{0
}
;NAMES OF CURRENT TEM (TFL) FILE FOR EACH WIRE
TEMNAM: EACH
{TEMNM!N:: 0
}
IIN: EACH
{ IN N,
}
TINIT: EACH
{ INIT T+N,200
}
TENTER: EACH
{ ENTER T+N,W
}
TOUTBF: EACH
{ OUTBUF T+N,1
}
TLOOKP: EACH
{ LOOKUP T+N,W
}
TOUT: EACH
{ OUT T+N,
}
;MTAPE UUO TO UPDATE RETRIEVAL OF CURRENT TEM (TFL) FILES
TMTAPE: EACH
{ MTAPE T+N,['GODMOD'↔17]
}
TCLOSE: EACH
{ CLOSE T+N,
}
TRENAM: EACH
{ RENAME T+N,W
}
TRELEA: EACH
{ RELEAS T+N,
}
LPDL←←10
PDL: BLOCK LPDL ;area for stack
DSK17: 217 ;block used for opening the dsk in mode 17 many times
SIXBIT /DSK/ ;200 bit means take error return automatically
0 ;if DISK IS FULL or BAD RETRIEVAL
DONAME: SIXBIT /[DOER]/
DOER: SIXBIT /DSK/ ;block used to start up DOER
SIXBIT /DOER/ ;program name goes here
'DMP',,14 ;USE NEW JOB and dont set JLOG
0 ;normal starting address, normal core assignment
NSPPN ;PPN OF DOER.DMP
0 ;LOG DOER IN UNDER SAME PPN FILER IS USING
ERRBK: SIXBIT /DSK/ ;block used to start up error-handling program
ERRPRG ;program name goes here
'DMP',,0
1 ;NORMAL CORE SIZE, RPG STARTUP (SA+1)
NSPPN
CRLF: ASCIZ /
/
MYNAME: SIXBIT /[-NS-]/
;MAIN NEWFIL GETTTY
MAIN: CORE A, ;CORE DOWN, DISCARDING INITIALIZATION CODE
JFCL ;CANT CORE DOWN
NEWFIL: LOCK W, ;LOCK JOB IN CORE!
XCT TINIT(R)
SIXBIT /DSK/
0
UFATAL 16 ;;;CANT INIT DSK
ACCTIM W, ;USE <DATE>,,<TIME> AS FILENAME
HLRZ X,W ;GET DATE
DAYCNT X, ;CONVERT TO DAYCNT FORMAT
HRL W,X
MOVSI X,'TEM'
SETZ Y,
MOVE Z,WIRES(R) ;PPN OF THIS WIRE SERVICE
XCT TENTER(R)
AOJA W,[XCT TENTER(R);TRY AT MOST TWICE TO DO AN ENTER
UDELAY 1,20 ;;;CANT ENTER OUTPUT FILE (.TEM)
JRST .+1]
MOVEM W,TEMNAM(R) ;SAVE NAME OF CURRENT FILE
MOVE B,OPOINT(R) ;ADDRESS OF BYTE POINTER IN BUFFER HEADER
SUBI B,1 ; MAKE INTO ADDRESS OF BUFFER HEADER
HRLZM B,HDRPTR
XCT TINIT(R) ;RELEASE NEW FILE AND OPEN IN RA MODE
SIXBIT /DSK/
HDRPTR: OBUF0,,0
UFATAL 22 ;;;CANT INIT DSK
HRRZ B,OCOUNT(R) ;PTR TO BYTE COUNT WHICH IS WORD BEFORE OUTPUT BUFFER
ADDI B,1 ;MAKE PTR TO BUFFER
EXCH B,JOBFF↑
XCT TOUTBF(R) ;SET UP OUTPUT BUFFER
MOVEM B,JOBFF
MOVE Z,WIRES(R) ;PPN
XCT TLOOKP(R) ;LOOKUP NEW (EMPTY) FILE
UFATAL 24 ;;;CANT LOOKUP NEW OUTPUT FILE
MOVE Z,WIRES(R)
XCT TENTER(R) ;OPEN FOR OUTPUT IN RA MODE
UFATAL 26 ;;;CANT OPEN NEW OUTPUT FILE IN RA MODE
GETTTY: MOVEI E,2
JRST GETCH ;GET AP CHAR AND OUTPUT IT
GETRET: CAIE C,LF ;LOOK FOR 3 STRAIGHT LFs (GETCH RETURNS HERE)
MOVEI E,3 ;HAVEN'T SEEN ANY YET
SOJGE E,GETCH
;END1
MOVEI C,200 ;MAKE SURE STORY ENDS WITH NULL
PUSHJ P,PUTCH3 ; (BUT DONT PUT NULL INTO HOTLINE BUFFER)
XCT TOUT(R) ;PUT OUT LAST PARTIAL BUFFER
AOSA @OCOUNT(R) ;KEEP BYTE COUNT ACCURATE
UFATAL 30 ;;;OUT UUO FAILED TO OUTPUT LAST RECORD OF STORY
XCT TMTAPE(R) ;AND UPDATE RETRIEVAL
OPEN T1,DSK17
UFATAL 32 ;;;CANT OPEN DSK
MOVE W,OLDNAM(R)
MOVSI X,'TFL'
MOVE Z,WIRES(R) ;PPN
SETZ C, ;FLAG--ASSUME FILE FOUND
LOOKUP T1,W ;LOOK FOR PREVIOUS OUTPUT FILE
SETO C, ;APPARENTLY NOT THERE
RELEAS T1,
JUMPE C,END2 ;JUMP IF OLD FILE STILL THERE. USE SAME TEM FILE
XCT TCLOSE(R) ;PREVIOUS FILE GONE. CLOSE CURRENT FILE.
MOVE W,TEMNAM(R) ;GET NAME OF CURRENT OUTPUT FILE
END1: MOVSI X,'TFL'
SETZ Y,
MOVE Z,WIRES(R) ;PPN
XCT TRENAM(R) ;RENAME .TFL←.TEM
UFATAL 34 ;;;CANT RENAME TEM FILE TO TFL
XCT TRELEA(R)
MOVEM W,OLDNAM(R) ;SAVE NAME OF THIS FILE
END2: MOVEI B,DOER ;think about starting up DOER
MOVE A,DONAME ;see if a DOER job exists
NAMEIN A,
ORI A,400 ;NOTE THAT NAMEIN FAILED (NO UNIQUE DOER)
CAIN A,401 ;CHECK ERROR CODE
SWAP B, ;NO DOERS. START ONE UP
JUMPE C,GETTTY ;NO NEW FILE YET
JRST NEWFIL ;GO OPEN A NEW OUTPUT FILE
;GETCH PUTCH PUTSTR
GETCH: SOSLE @ICOUNT(R) ;ANY CHARS IN INPUT BUFFER
JRST GETCH1 ;YES. GET ONE.
PUSHJ P,CHGWIR
XCT IIN(R) ;NO. GET NEW BUFFER
JRST GETCH2
UFATAL 36 ;;;INPUT ERROR FROM TTY12
GETCH2: MOVE A,@ICOUNT(R) ;GET NUMBER OF CHARS IN BUFFER
IFN BUFCNT <
PUSHJ P,NXTDG
OUTCHR [" "]
MOVE A,@ICOUNT(R)
>;END IFN BUFCNT
CAIGE A,BUFMAX
JRST GETCH1 ;NOT FULL BUFFER
MOVEI A,[ASCIZ/...
/] ;FULL BUFFER--ASSUME WE MISSED SOME CHARS
PUSHJ P,PUTSTR ;INSERT "...CRLF"
GETCH1: ILDB C,@IPOINT(R)
TDNE C,MASK(R)
JRST [MOVEI C,"%" ;FUNNY BIT ON IN WIRE CHAR
JRST GETCH3] ;PUT OUT FUNNY CHAR
ADD C,SHIFT(R) ;ACCOUNT FOR CURRENT SHIFT SETTING
XCT @CODE(R) ;CONVERT FROM TTS CODES TO ASCII
JUMPE C,GETCH ;NO NULLS PLEASE
GETCH3: PUSHJ P,PUTCH
JRST GETRET ;RETURN FROM GETCH
PUTCH0: MOVE B,SFRONT(R) ;BYTE PTR TO FRONT OF HOTLINE BUFFER
SETZM (B) ;CLEAR FIRST WORD
MOVEM B,SPOINT(R) ;SET UP BYTE PTR INTO HOTLINE BUFFER
MOVEI B,(LSPCL-2)*5 ;NUMBER OF CHARS HOTLINE BUFFER WILL HOLD
MOVEM B,SCOUNT(R) ;SET UP BYTE COUNT
JRST PUTCH2
PUTCH: SOSG SCOUNT(R) ;ANY ROOM LEFT IN HOTLINE BUFFER?
JRST PUTCH0 ;NO, MOVE TO TOP OF HOTLINE BUFFER
MOVE B,SPOINT(R) ;BYTE POINTER INTO HOTLINE BUFFER
SETZM 1(B) ;CLEAR NEXT WORD
PUTCH2: IDPB C,SPOINT(R) ;PUT CHAR INTO HOTLINE BUFFER
PUTCH3: SOSG @OCOUNT(R) ;ANY ROOM LEFT IN OUTPUT BUFFER?
XCT TOUT(R) ;WRITE OUT BUFFER
JRST PUTCH1 ;YES
UFATAL 40 ;;;DISK OUTPUT ERROR
PUTCH1: IDPB C,@OPOINT(R)
POPJ P,
PUTSTR: TLOA A,440700 ;MAKE A BYTE POINTER
PUTST1: PUSHJ P,PUTCH
ILDB C,A
JUMPN C,PUTST1
POPJ P,
;UUCODE NXTDG CHGWIR
UUCODE: 0
SETO A,
GETLIN A
AOJE A,DET
OUTSTR [ASCIZ /
FILER error #/]
HRRZ A,40 ;get error number
PUSHJ P,NXTDG ;TYPE OUT ERROR NUMBER
EXIT 1,
HALT .
JRST @UUCODE
DET: RESET
MOVE 0,R ;PASS WIRE CODE IN AC 0
MOVE 1,MYNAME ; JOB NAME IN AC 1
MOVE 2,40 ; AND ERROR UUO IN AC 2
MOVEI 16,ERRBK
SWAP 16,
EXIT
NXTDG: IDIVI A,=8 ;convert number in A to octal ASCII string
HRLM B,(P)
JUMPE A,.+2
PUSHJ P,NXTDG
HLRZ A,(P)
ADDI A,"0"
OUTCHR A
POPJ P,
CHGWIR: MOVEM R,RSAVE#
POP P,PC(R)
MOVEM E,ESAVE(R) ;SAVE AN AC FOR THE OLD WIRE
CHGWR1: IMSKCL 1,[INTTTY,,0] ;MASK OFF TTY INTERRUPTS
CHGWR0: SOJGE R,.+2 ;NEXT WIRE PLEASE
MOVEI R,NWIRES-1 ; START OVER WITH FIRST WIRE
XCT TTSKIP(R) ;ANY INPUT FOR THIS WIRE?
JRST CHGWR2 ;NO
MOVE E,ESAVE(R) ;YES, RESTORE AN AC FOR THE NEW WIRE
INTMSK [-1] ;MASK TTY INTERRUPTS BACK ON
JRST @PC(R)
CHGWR2: CAME R,RSAVE ;HAVE WE TRIED ALL WIRES?
JRST CHGWR0 ;NO, TRY NEXT ONE
IMSTW [-1] ;YES, MASK TTY INTERRUPTS ON AND GO TO SLEEP
JRST CHGWR1
;CHGNAM INTRPT
;interrupt level routine to set the job name
CHGNAM: MOVEI A,INTRP2
MOVEM A,JOBAPR ;FUTURE INTERRUPTS GO TO DIFFERENT PLACE
MOVSI A,INTPTI ;disable name change interrupts
INTACM A,
SETZ A, ;zero out own job name
SETNAM A,
SETOM NBRFLR# ;initialize indicator to one other filer
MOVE A,MYNAME ;get filer's name from wakeme block
NAMEIN A,
JRST .+2 ;zero or multiple filers exist
DISMIS ;one other filer exists
SETZM NBRFLR ;set indicator to multiple filers
CAIE A,1 ;check error code of NAMEIN
DISMIS ;two or more other filers exist
AOS NBRFLR ;set indicator to no other filers
MOVE A,MYNAME ;change job name
SETNAM A,
MOVEI A,200000
INTACM A, ;disable for further pdl ov ints
DISMIS
;interrupt level module
INTRPT: MOVS A,JOBCNI↑ ;get bit causing interrupt
CAIN A,INTPTI ;is this interrupt to set filer's job name?
JRST CHGNAM ;yes. do it
INTRP2: MOVS A,JOBCNI↑
CAIE A,INTPAR
DISMIS ;IGNORE STRANGE INTERRUPT
UWAIT ;PARITY ERROR. GIVE UP AND GO HOME
JRST 2,@[.+1] ;get out of user-iot
DEBREAK
EXIT ;PARITY ERROR IN FILER
;APCODE NYCODE
APCODE: JRST GETCH ;0: tape feed
MOVEI C,"e" ;1
MOVEI C,LF ;2: elevate→line feed
MOVEI C,"a" ;3
JRST CKPARA ;4: space. make into 4 spaces if after LF
MOVEI C,"s" ;5
MOVEI C,"i" ;6
MOVEI C,"u" ;7
MOVEI C,CR ;10: carriage return
MOVEI C,"d" ;11
MOVEI C,"r" ;12
MOVEI C,"j" ;13
MOVEI C,"n" ;14
MOVEI C,"f" ;15
MOVEI C,"c" ;16
MOVEI C,"k" ;17
MOVEI C,"t" ;20
MOVEI C,"z" ;21
MOVEI C,"l" ;22
MOVEI C,"w" ;23
MOVEI C,"h" ;24
MOVEI C,"y" ;25
MOVEI C,"p" ;26
MOVEI C,"q" ;27
MOVEI C,"o" ;30
MOVEI C,"b" ;31
MOVEI C,"g" ;32
JRST SETSHF ;33: shift
MOVEI C,"m" ;34
MOVEI C,"x" ;35
MOVEI C,"v" ;36
JRST CLRSHF ;37: unshift
JRST CKPARA ;40: thin space→space
MOVEI C,"3" ;41
MOVEI C,LF ;42: paper feed→line feed
MOVEI C,"$" ;43
JRST CKPARA ;44: add thin space→space
JRST CKPARA ;45: em space→space
MOVEI C,"8" ;46
MOVEI C,"7" ;47
MOVEI C,"'" ;50
MOVEI C,"-" ;51
MOVEI C,"4" ;52
JRST GETCH ;53: bell
MOVEI C,"," ;54: comma
JRST GETCH ;55: undefined
JRST CKPARA ;56: en space→space
JRST GETCH ;57: quad right
MOVEI C,"5" ;60
MOVEI C,")" ;61
JRST CKPARA ;62: em space→space
MOVEI C,"2" ;63
JRST GETCH ;64: em leader
MOVEI C,"6" ;65
MOVEI C,"0" ;66
JRST GETCH ;67: en leader
MOVEI C,"9" ;70
JRST GETCH ;71: upper rail
MOVEI C,";" ;72
JRST GETCH ;73: lower rail
MOVEI C,"." ;74: period
MOVEI C,"1" ;75
JRST GETCH ;76: undefined
JRST GETCH ;77: rub out
;NY LOWER CASE, AP UPPER CASE
NYCODE: JRST GETCH ;0: tape feed
MOVEI C,"E" ;1
MOVEI C,LF ;2: elevate→line feed
MOVEI C,"A" ;3
JRST CKPARA ;4: space. make into 4 spaces if after LF
MOVEI C,"S" ;5
MOVEI C,"I" ;6
MOVEI C,"U" ;7
MOVEI C,CR ;10: carriage return
MOVEI C,"D" ;11
MOVEI C,"R" ;12
MOVEI C,"J" ;13
MOVEI C,"N" ;14
MOVEI C,"F" ;15
MOVEI C,"C" ;16
MOVEI C,"K" ;17
MOVEI C,"T" ;20
MOVEI C,"Z" ;21
MOVEI C,"L" ;22
MOVEI C,"W" ;23
MOVEI C,"H" ;24
MOVEI C,"Y" ;25
MOVEI C,"P" ;26
MOVEI C,"Q" ;27
MOVEI C,"O" ;30
MOVEI C,"B" ;31
MOVEI C,"G" ;32
JRST SETSHF ;33: shift
MOVEI C,"M" ;34
MOVEI C,"X" ;35
MOVEI C,"V" ;36
JRST CLRSHF ;37: unshift
JRST CKPARA ;40: thin space→space
JRST SPE3 ;41: 3/8
MOVEI C,LF ;42: paper feed→line feed
MOVEI C,"!" ;43
JRST CKPARA ;44: add thin space→space
JRST CKPARA ;45: em space→space
MOVEI C,"-" ;46
JRST SPE7 ;47: 7/8
MOVEI C,"'" ;50: left quote→right quote (ttys dont have left quote)
MOVEI C,"+" ;51
JRST SPE4 ;52: 1/2
JRST GETCH ;53: bell
MOVEI C,"," ;54: comma
JRST GETCH ;55: undefined
JRST CKPARA ;56: en space→space
JRST GETCH ;57: quad right
JRST SPE5 ;60: 5/8
MOVEI C,"(" ;61
JRST CKPARA ;62: em space→space
JRST SPE2 ;63: 1/4
JRST GETCH ;64: em leader
JRST SPE6 ;65: 3/4
MOVEI C,"?" ;66
JRST GETCH ;67: en leader
MOVEI C,"&" ;70
JRST GETCH ;71: upper rail
MOVEI C,":" ;72
JRST GETCH ;73: lower rail
MOVEI C,"." ;74: period
JRST SPE1 ;75: 1/8
JRST GETCH ;76: undefined
JRST GETCH ;77: rub out
;NY FIGS
JRST GETCH ;00
MOVEI C,"3" ;01
MOVEI C,LF ;02: PAPER FEED→LINE FEED
MOVEI C,"-" ;43
MOVEI C," " ;SPACE
JRST GETCH ;05: BELL
MOVEI C,"8" ;46
MOVEI C,"7" ;47
MOVEI C,CR ;50
MOVEI C,"$" ;51
MOVEI C,"4" ;52
MOVEI C,47 ;13: SINGLE QUOTE
MOVEI C,"," ;54: comma
MOVEI C,"!" ;55: EXCLAMATION POINT
MOVEI C,":" ;16: COLON
MOVEI C,"(" ;17: LEFT PAREN
MOVEI C,"5" ;60
MOVEI C,42
MOVEI C,")" ;61
MOVEI C,"2" ;63
JRST GETCH ;64
MOVEI C,"6" ;65
MOVEI C,"0" ;66
MOVEI C,"1" ;75
MOVEI C,"9" ;70
MOVEI C,"?" ;72
MOVEI C,"&" ;74
JRST SETSHF ;SHIFT
MOVEI C,"." ;PERIOD
MOVEI C,"/"
MOVEI C,";"
JRST CLRSHF ;UNSHIFT
;SETSHF CLRSHF SPE1-7 CKPARA SPE0
CLRSHF: TDZA C,C
SETSHF: MOVEI C,100
MOVEM C,SHIFT(R)
JRST GETCH
SPE1: MOVEI A,[ASCIZ ⊗ 1/8⊗]
JRST SPE0
SPE2: MOVEI A,[ASCIZ ⊗ 1/4⊗]
JRST SPE0
SPE3: MOVEI A,[ASCIZ ⊗ 3/8⊗]
JRST SPE0
SPE4: MOVEI A,[ASCIZ ⊗ 1/2⊗]
JRST SPE0
SPE5: MOVEI A,[ASCIZ ⊗ 5/8⊗]
JRST SPE0
SPE6: MOVEI A,[ASCIZ ⊗ 3/4⊗]
JRST SPE0
SPE7: MOVEI A,[ASCIZ ⊗ 7/8⊗]
JRST SPE0
CKPARA: MOVEI C," "
CAIN R,1 ;ONLY AP GETS EXTRA SPACES
CAILE E,1 ;if the previous char was a LF, CNT will be 1
JRST GETCH3 ;not after LF--put out a space
MOVEI A,[ASCIZ ⊗ ⊗] ;AFTER LF--PUT OUT FOUR SPACES
SPE0: PUSHJ P,PUTSTR
JRST GETRET
XLIST
VAR
LIT
LIST
;FILER
FILER: RESET
MOVE P,[IOWD LPDL,PDL];initialize pdl pointer
MOVEI A,INTRPT ;get address of interrupt level module
MOVEM A,JOBAPR↑ ;store it
MOVSI A,INTPTI!INTPAR!INTTTY ;enable interrupts on parity errors
INTENB A, ; and pty input AND TTY INPUT
MOVSI A,INTPTI
INTGEN A, ;generate a pty input int to set the job name
MOVE A,NBRFLR ;get code indicating number of other filers
JRST .+2(A)
EXIT ;ONE OTHER FILER ALREADY EXISTED
UFATAL 2 ;;;TWO OR MORE OTHER FILERS ALREADY EXISTED
INIT I,411 ;grab NYT news line, take error return if not avail
SIXBIT /TTY13/
IBUF0
UDELAY 2,4 ;;;INIT FAILED ON TTY12
INIT I+1,411 ;grab AP news line, take error return if not avail
SIXBIT /TTY12/
IBUF1
UDELAY 2,5 ;;;INIT FAILED ON TTY13
MOVSI A,000700 ;7-BIT BYTES FOR EACH INPUT WIRE
EACH
{ MOVEM A,IBUF!N+1
}
MOVEI B,TTYBUF ;set up buffers for input wires at TTYBUF
EXCH B,JOBFF↑
EACH
{ INBUF N,NIBUFS
}
MOVEM B,JOBFF ;restore old value of JOBFF
EACH
{ SETZM OLDNM!N ;ZERO NAME OF PREVIOUS OUTPUT FILE
}
EACH
{ SETZM SHIFT!N
}
;CHKTEM
INIT T1,210 ;LOOK AT UFD FOR A .TEM FILE TO RENAME TO .TFL
SIXBIT /DSK/
OBUF0 ;ACTUALLY INPUT BUFFER HEADER
UFATAL 6 ;;;CANT INIT DSK
MOVEI B,BUF0
EXCH B,JOBFF↑
INBUF T1,1
MOVEM B,JOBFF
MOVEI R,1 ;LOOK FOR TEM FILES ON EACH WIRE'S AREA
CHKTE0: MOVE W,WIRES(R)
MOVSI X,'UFD'
MOVE Z,[' 1 1']
LOOKUP T1,W ;LOOKUP UFD
UFATAL 10 ;;;CANT LOOKUP UFD
MOVEI A,2
MOVNI B,4
CHKTEM: IN T1,
JRST CHKTE1
STATO T1,20000
UFATAL 12 ;;;DISK INPUT ERROR FROM READING UFD
CHKTE3: SOJGE R,CHKTE0
JRST CLSUFD
CHKTE1: ILDB W,OBUF0+1 ;get filename from UFD
ILDB X,OBUF0+1 ;get extension
ADDM A,OBUF0+1 ;skip last two words of each UFD entry
HLLZ X,X
CAMN X,['TEM '] ;is this a .TEM file?
TDNE W,[760000,,400000] ;ANY OF THESE BITS ON MEANS CANT BE OURS
JRST CHKTE2
MOVE Z,WIRES(R) ;GOT A TEM FILE
OPEN T,DSK17
UFATAL 14 ;;;CANT OPEN DSK
LOOKUP T,W
JRST CHKTE2 ;IF CANT OPEN IT, IGNORE IT
MOVSI X,'TFL'
SETZ Y,
MOVE Z,WIRES(R)
RENAME T,W ;MAKE IT A TFL FILE
UFATAL 15 ;;;CANT RENAME OLD TEM FILE TO TFL
CLOSE T,
MOVEM W,OLDNAM(R)
JRST CHKTE3
CHKTE2: ADDM B,OBUF0+2 ;DECREMENT BUFFER HEADER BYTE COUNT
SKIPLE OBUF0+2 ;ANYTHING ELSE IN BUFFER?
JRST CHKTE1 ;YES
JRST CHKTEM
CLSUFD: RELEAS T1,
SETZM BUF0 ;CLEAR OUTPUT BUFFERS FOR HOT
MOVE A,[BUF0,,BUF0+1]
BLT A,BUF0+203-1
MOVEI A,DOER
SWAP A,
MOVEI R,1 ;START WITH AP LINE
IFE DEBUG, <
MOVEI A,FILER-1 ;ADDRESS WE CAN CORE DOWN TO NOW
JRST MAIN ;NOT DEBUGGING: CORE DOWN
>
IFN DEBUG, <
JRST NEWFIL ;DEBUGGING: DON'T CORE DOWN
>
END FILER